﻿// <copyright file="IEnumerableExtensions.cs" company="N/A">
//     Copyright (c) Nicholas Barrett and Benjamin Kasten.  All rights reserved.
//
//     This program is free software; you can redistribute it and/or modify it
//     under the terms of the GNU General Public License as published by the
//     Free Software Foundation; either version 2 of the License, or (at your
//     option) any later version.
//
//     This program is distributed in the hope that it will be useful, but
//     WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
//     Public License for more details.
//
//     You should have received a copy of the GNU General Public License along
//     with this program; if not, write to the Free Software Foundation, 
//     Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// </copyright>

namespace BetterAzureTableStorage
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    /// <summary>
    /// Extension methods for classes that implement IEnumerable.
    /// </summary>
    public static class IEnumerableExtensions
    {
        /// <summary>
        /// Splits an IEnumerable into a list of enumerables of the specified <paramref name="length"/>
        /// </summary>
        /// <typeparam name="T">The enumerated type.</typeparam>
        /// <param name="self">The enumerable to split.</param>
        /// <param name="length">The length to split into.</param>
        /// <returns>An IList of IList{T} containing no more than <paramref name="length"/> objects.</returns>
        public static IList<IList<T>> Split<T>(this IEnumerable<T> self, int length)
        {
            // Clone in case self changes during split.
            IEnumerable<T> mySelf = self.ToList();

            IList<IList<T>> result = new List<IList<T>>();
            IList<T> group = new List<T>();

            foreach (T item in mySelf)
            {
                group.Add(item);

                if (group.Count == length)
                {
                    result.Add(group);
                    group = new List<T>();
                }
            }

            if (group.Count > 0 && group.Count < length)
            {
                result.Add(group);
            }

            return result;
        }
    }
}
